package com.otherTest.interview;

import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 对文件夹进行递归调用，显示出文件目录的层次感
 *
 * @author Conceit
 * 2018/1/30 增加方法
 * @since 1.0.0, 2018/1/30
 */
public class FileRecursionLine {

    String directorySign = "+";
    String fileSign = "-";
    String sign = "-->";
    int flag = 1;

    @Test
    public void doFileRecursionLine() {
        File file = new File(getCurrentProjectFile().getAbsolutePath());
        //如果是文件则直接打印出来
        if (file.isDirectory()) {
            printDirectoryCatalogue(file, flag);
        } else {
            System.out.println(file.getAbsolutePath());
        }

    }

    /**
     * 获取当前项目的路径
     *
     * @param
     * @return 返回类型 File
     */
    public File getCurrentProjectFile() {
        return new File(System.getProperty("user.dir"));
    }

    /**
     * 打印文件夹路径
     *
     * @param file file对象
     * @return void
     */
    public void printDirectoryCatalogue(File file, int flag) {

        File[] files = file.listFiles();
        //文件夹排序
        files = sort(files);

        //遍历此文件夹
        for (File f : files) {
            //是文件夹
            if (f.isDirectory()) {
                flag++;
                System.out.println(f.getAbsolutePath());
                //递归调用
                printDirectoryCatalogue(f, flag);
                flag--;
            }

            //是文件,输出文件名
            else {
                for (int i = 0; i < flag; i++) {
                    System.out.print("-");
                }
                System.out.println(f.getName());
            }
        }
    }

    /**
     * 文件夹排序
     *
     * @param files files
     * @return 返回类型 File[] files
     */
    private static File[] sort(File[] files) {
        List<File> flist = new ArrayList<File>();
        for (File f : files) {
            if (!f.isDirectory()) {
                flist.add(f);
            }

        }
        for (File f : files) {
            if (f.isDirectory()) {
                flist.add(f);
            }

        }

        return flist.toArray(new File[flist.size()]);
    }

}
